<!doctype html>
<html>
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
<?php
/**
 * Created by PhpStorm.
 * User: zlz5v
 * Date: 2018/8/15
 * Time: 12:53
 */
//$x = 4;
//$y = 5;
//$z = $x + $y;
//echo "$z";
/*变量名是用于储存数据的容器：
 * 定义变量的关键子是“$”
 * 变量名必须是以字母和下划线为开头，但不建议使用下划线开头，因为一般下划线开头的变量都是PHP自带的系统变量
 * 变量名只能含有大小写的a-z和数字0-9和下划线“_”
 * 变量名不能包含空格，对大小写敏感
 */
/*
 * PHP是一门弱类语言：
 * 在上面的实例中，我们注意到，不必向PHP声明该变量的数据类型
 * PHP会根据变量的值，自动把变量转换为正确的数据类型
 * 在强类型（如：java），我们必须在使用变量前先声明（定义）变量的类型和名称
 */
/*
 * PHP变量的作用域：
 * PHP有四个不同的变量作用域：
 * local:
 * global:用于函数访问全局变量
 * static:保留局部变量不被删除
 * parameter:
 */
/*
 * 局部和全局作用域：
 * 在所有函数外部定义的变量，拥有全局作用域，全局作用域可以被脚本中任何部分访问，要在一个函数中访问一个全局变量需要用到global关键字
 * 在PHP函数内部声明的变量是局部变量，仅能在函数内部访问
 */
$m = 5;
function myTest()
{
    $y = 10;
    echo "这个函数值得对比：";
    echo "内部的y值是：$y";
    echo "<br/>";
//    echo "外部的m值是: $m";
}

myTest();
echo "这个函数值得对比：";
//echo "内部的y值是：$y";
echo "<br/>";
echo "外部的m值是：$m ";
echo "<br/>";
/*
 * 你可以在不同函数中使用相同的变量名称，因为这些函数内定义的全局变量，我们需要在函数中的变量加上global
 * 在以上实例中 myTest() 函数定义了 $x 和 $y 变量。 $x 变量在函数外声明，所以它是全局变量 ， $y 变量在函数内声明所以它是局部变量。
 * 当我们调用myTest()函数并输出两个变量的值, 函数将会输出局部变量 $y 的值，但是不能输出 $x 的值，因为 $x 变量在函数外定义，无法在函数内使用，如果要在一个函数中访问一个全局变量，需要使用 global 关键字。
 * 然后我们在myTest()函数外输出两个变量的值，函数将会输出全局部变量 $x 的值，但是不能输出 $y 的值，因为 $y 变量在函数中定义，属于局部变量
 */
/*
 * PHP global关键字：
 * global 关键字用于函数访问全局变量
 * 在函数内调用函数外定义的全局变量，我们需要在函数中的变量上加上global关键字
 */
$x = 5;
$y = 10;
function myTest_1()
{
    global $x, $y;
    $y = $x + $y;
}

myTest_1();
echo "myText_1()得到的值是：";
echo $y;//15
echo "<br/>";
/*
 * php 将所有的全局变量储存在一个名为$GLOBAL[index]的数组中，index保存变量的名称，index保存变量的名称。
 * 这个数组可以在函数内部访问，也可以直接用来更新全局变量
 */
$x = 5;
$y = 9;
function myText_2()
{
    $GLOBALS['y'] = $GLOBALS['x'] + $GLOBALS['y'];
}

myText_2();
echo "myText_2()得到的值是：";
echo "$y";
echo "<br/>";

/*
 * Static作用域：
 * 当一个函数完成时，它的所有变量通常会被删除。然而，有时候你希望某个局部变量不要被删除
 * 有要做到这一点，请你在第一次声明变量时使用static关键字
 */

function myTest_4()
{
    static $x = 5;
    $y = 6;
    echo "这是myText_4()的值：";
    echo "$x 和 $y";
    echo "<br/>";
    $x++;
    $y++;
}

myTest_4();
myTest_4();
myTest_4();
myTest_4();

//参数作用域
function myTest_5($x){
    echo "这是myText_5()的值：";
    echo "$x";
    echo "<br/>";
}
myTest_5(5);


?>
</body>
</html>